package pe.com.bbva.mantenimiento.dao.impl;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import oracle.jdbc.OracleTypes;

import org.apache.log4j.Logger;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import pe.com.bbva.mantenimiento.dao.ProveedorDAO;
import pe.com.bbva.mantenimiento.domain.Proveedor;
import pe.com.bbva.targps.domain.DetalleArchivoEncarteGPS;
import pe.com.bbva.util.Constantes;
import pe.com.stefanini.core.dao.GenericDAOImpl;
import pe.com.stefanini.core.exceptions.BOException;
import pe.com.stefanini.core.exceptions.DAOException;
import pe.com.stefanini.core.util.StringUtil;

@Service("proveedorDAO")
public class ProveedorDAOImpl extends GenericDAOImpl<Proveedor> implements
		ProveedorDAO {
	Logger logger = Logger.getLogger(this.getClass());
	@Autowired
	public ProveedorDAOImpl(SessionFactory sessionFactory) {
		super(sessionFactory);
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Proveedor> findProveedores(Proveedor proveedor)
			throws BOException, DAOException {
		String where = "";
		if(proveedor.getCodigoProveedor()!= null && !proveedor.getCodigoProveedor().equals("")){
			where = where + (where==""?"":" AND ") + "codigoProveedor = '" + proveedor.getCodigoProveedor() + "' ";
		}
		if(proveedor.getNombre()!= null && !proveedor.getNombre().equals("")){
			where = where + (where==""?"":" AND ") + "upper(nombre) like upper('%" + proveedor.getNombre() + "%') ";
		}
		if(proveedor.getNombreArchivo()!= null && !proveedor.getNombreArchivo().equals("")){
			where = where + (where==""?"":" AND ") + "upper(nombreArchivo) like upper('%" + proveedor.getNombreArchivo() + "%') ";
		}
		if(proveedor.getTipo()!=null){
			if(proveedor.getTipo().getId()!= null && !proveedor.getTipo().getId().equals("")){
				where = where + (where==""?"":" AND ") + "tipo = '" + proveedor.getTipo().getId() + "'";
			}
		}
		if(proveedor.getEstado()!= null && !proveedor.getEstado().equals("") && !proveedor.getTipo().equals("0") ){
			where = where + (where==""?"":" AND ") + "estado = '" +	proveedor.getEstado() + "'";
		}
		if(!where.equals("")){
			where = Constantes.WHERE_CLAUSE + where;
		}
		
		String orders = " order by fechaCreacion, nombre";
		List<Proveedor> listaProveedores = super.executeQuery(Proveedor.class, where, orders);
		return listaProveedores;
	}

	@Override
	public List<Proveedor> findProveedoresEquals(Proveedor proveedor)
			throws BOException, DAOException {
		String where = "";
		if(proveedor.getCodigoProveedor()!= null && !proveedor.getCodigoProveedor().equals("")){
			where = where + (where==""?"":" AND ") + "codigoProveedor = '" + proveedor.getCodigoProveedor() + "' ";
		}
		if(proveedor.getNombre()!= null && !proveedor.getNombre().equals("")){
			where = where + (where==""?"":" AND ") + "upper(nombre) = upper('" + proveedor.getNombre() + "') ";
		}
		if(proveedor.getNombreArchivo()!= null && !proveedor.getNombreArchivo().equals("")){
			where = where + (where==""?"":" AND ") + "upper(nombreArchivo) = upper('" + proveedor.getNombreArchivo() + "') ";
		}
		if(proveedor.getTipo()!=null){
			if(proveedor.getTipo().getId()!= null && !proveedor.getTipo().getId().equals("")){
				where = where + (where==""?"":" AND ") + "tipo = '" + proveedor.getTipo().getId() + "'";
			}
		}
		if(proveedor.getEstado()!= null && !proveedor.getEstado().equals("") && !proveedor.getTipo().equals("0") ){
			where = where + (where==""?"":" AND ") + "estado = '" +	proveedor.getEstado() + "'";
		}
		if(!where.equals("")){
			where = Constantes.WHERE_CLAUSE + where;
		}
		
		String orders = " order by fechaCreacion, nombre";
		List<Proveedor> listaProveedores = super.executeQuery(Proveedor.class, where, orders);
		return listaProveedores;
	}

	@Override
	public List<Proveedor> listaCourierPendientes(String codProceso) throws DAOException {
		Session hibernateSession = null;
		Connection con = null;
		CallableStatement cstmt = null;
		ResultSet rs = null;
		List<Proveedor> lista = new ArrayList<Proveedor>();
		Proveedor proveedor = null;
		try {
			hibernateSession = getHibernateTemplate()
					.getSessionFactory().openSession();
			con = hibernateSession.connection();
			cstmt =con.prepareCall("{call TARGPS.TARGPSPKG.PR_TARGPS_LISTA_PROVEEDORES(?,?,?,?)}");
			cstmt.setString(1,codProceso);
			cstmt.registerOutParameter(2, OracleTypes.CURSOR);
			cstmt.registerOutParameter(3, OracleTypes.INTEGER );
			cstmt.registerOutParameter(4, OracleTypes.VARCHAR );
			cstmt.executeQuery();
			rs = (ResultSet) cstmt.getObject(2);
			while (rs.next()) {
				proveedor = new Proveedor();
				proveedor.setId(rs.getLong("NID_PROVEEDOR"));
				proveedor.setNombre(rs.getString("TXT_NOMBRE"));
				proveedor.setNombreArchivo(rs.getString("TXT_NOMBRE_ARCH"));
				proveedor.setCodigoProveedor(rs.getString("COD_PROVEEDOR"));
				lista.add(proveedor);
			}
		} catch (HibernateException e) {
			logger.info(StringUtil.getStackTrace(e));
			throw new DAOException(e.getMessage());
		} catch (SQLException e) {
			logger.info(StringUtil.getStackTrace(e));
			throw new DAOException(e.getMessage());
		} catch (Exception e) {
			logger.info(StringUtil.getStackTrace(e));
			throw new DAOException(e.getMessage());
		} finally {
			try {
				if (rs != null) {
					rs.close();
				}
				if (cstmt != null) {
					cstmt.close();
				}
				if (con != null) {
					con.close();
				}
				hibernateSession.close();
			} catch (SQLException e) {
				logger.info(StringUtil.getStackTrace(e));
				throw new DAOException(e.getMessage());
			} catch (HibernateException e) {
				logger.info(StringUtil.getStackTrace(e));
				throw new DAOException(e.getMessage());
			}
		}
		return lista;
	
	}
}